package com.hn.gege.sys.modules.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hn.gege.sys.modules.sys.dto.RoleMenuTreeDTO;
import com.hn.gege.sys.modules.sys.entity.RoleMenu;
import com.hn.gege.sys.modules.sys.mapper.RoleMenuMapper;
import com.hn.gege.sys.modules.sys.service.IRoleMenuService;
import org.springframework.stereotype.Service;

import java.util.LinkedList;
import java.util.List;

/**
 * <p>
 * 角色菜单分配 服务实现类
 * </p>
 *
 * @author zxy
 * @since 2020-08-06
 */
@Service
public class RoleMenuServiceImpl extends ServiceImpl<RoleMenuMapper, RoleMenu> implements IRoleMenuService {

    @Override
    public RoleMenu getByPk(String roleId, String menuId) {
        LambdaQueryWrapper<RoleMenu> lambda = new QueryWrapper<RoleMenu>().lambda()
                .eq(RoleMenu::getRoleCode, roleId)
				.eq(RoleMenu::getMenuId, menuId);
        return baseMapper.selectOne(lambda);
    }

    @Override
    public boolean updateByPk(RoleMenu roleMenu) {
        LambdaQueryWrapper<RoleMenu> lambda = new QueryWrapper<RoleMenu>().lambda()
                .eq(RoleMenu::getRoleCode, roleMenu.getRoleCode())
				.eq(RoleMenu::getMenuId, roleMenu.getMenuId());
        return super.update(roleMenu, lambda);
    }

    @Override
    public boolean removeByPk(String roleId, String menuId) {
        LambdaQueryWrapper<RoleMenu> lambda = new QueryWrapper<RoleMenu>().lambda()
                .eq(RoleMenu::getRoleCode, roleId)
				.eq(RoleMenu::getMenuId, menuId);
        return super.remove(lambda);
    }

    @Override
    public List<RoleMenuTreeDTO> tree(String roleCode, String category) {
        List<RoleMenuTreeDTO> roleMenuTreeDTOS = baseMapper.selectMenusByRoleCodeAndParentId(category, roleCode);
        return treeAll(roleMenuTreeDTOS, roleCode);
    }

    @Override
    public boolean allocation(String roleCode, String category, String... menuIds) {
        //先删除
        super.remove(Wrappers.<RoleMenu>lambdaQuery().eq(RoleMenu::getRoleCode, roleCode).eq(RoleMenu::getCategory, category));

        LinkedList<RoleMenu> roleMenus = new LinkedList<>();
        for (String str : menuIds) {
            if (StringUtils.isBlank(str))
                continue;
            RoleMenu roleMenu = new RoleMenu().setCategory(category).setMenuId(str).setRoleCode(roleCode);
            roleMenus.add(roleMenu);
        }
        super.saveBatch(roleMenus);
        return true;
    }

    @Override
    public List<RoleMenuTreeDTO> roleMenu(String roleCode, String category) {
        List<RoleMenuTreeDTO> roleMenuTreeDTOS = baseMapper.selectRoleMenu(category, roleCode);
        return roleMenuAll(roleMenuTreeDTOS, roleCode);
    }

    /**
     * 树形数据生成
     * @param list
     * @param roleCode
     * @return
     */
    private List<RoleMenuTreeDTO> treeAll(List<RoleMenuTreeDTO> list, String roleCode){
        if(list == null || list.size() == 0)
            return null;

        list.forEach(item -> {
            List<RoleMenuTreeDTO> roleMenuTreeDTOS = baseMapper.selectMenusByRoleCodeAndParentId(item.getId(), roleCode);
            item.setChildren(treeAll(roleMenuTreeDTOS, roleCode));
        });
        return list;
    }

    private List<RoleMenuTreeDTO> roleMenuAll(List<RoleMenuTreeDTO> list, String roleCode){
        if(list == null || list.size() == 0)
            return null;

        list.forEach(item -> {
            List<RoleMenuTreeDTO> roleMenuTreeDTOS = baseMapper.selectRoleMenu(item.getId(), roleCode);
            item.setChildren(roleMenuAll(roleMenuTreeDTOS, roleCode));
        });
        return list;
    }


}
